/**
 * 单元格状态
 */
enum Chess {
    /** 白子 */
    WHITE = "white",
    /** 黑子 */
    BLACK = "black",
    /** 空白位置，任何颜色的棋子都可以落子 */
    EMPTY = "empty",
    /** 空白位置，但却是白子禁手，黑子可以落子 */
    BAN_WHITE = "empty-ban-white",
    /** 空白位置，但却是黑子禁手，白子可以落子 */
    BAN_BLACK = "empty-ban-black",
    /** 空白位置，任何颜色的棋子都不能落子 */
    BAN_ALL = "empty-ban-all"
}

/**
 * 游游戏结束的事件的参数
 */
 interface GameOverInstant {
    /** 游戏结果：黑棋或者白棋胜，或者平局 */
    result:GameResult,
    /** 用户的棋子类型，用来判断是否是当前用户胜利 */
    userChess:Chess
}

/**
 * 落子历史记录
 */
 interface ChessHistory {
    x : number,
    y : number,
    type : Chess
}

/**
 * 用户落子的事件监听
 */
interface UserChessListenner {
    (x:number, y:number):void;
}

/**
 * 游戏结束的事件监听器
 */
interface GameOverListenner {
    (state:GameOverInstant):void;
}

/**
 * 对局结果
 */
enum GameResult {
    /** 白子胜 */
    WHITE = "white",
    /** 黑子胜 */
    BLACK = "black",
    /** 平局 */
    EQULES = "equles"
}

/**
 * 游戏状态
 */
enum GameState {
    StART,
    END
}

/**
 * 五子棋对局结果
 */
interface GoBangResult {
    /** 对局结果 */
    res : GameResult,
    /** 连成一条线的 5 个棋子；这个位置坐标在平局的时候是空数组 */
    position:{x:number, y:number}[]
}
/**
 * 禁手规则
 */
interface ForbidRules {
    /** 是否禁止一子连成多个活四的情况 */
    doubleFour : boolean,
    /** 是否禁止一子连成多个活三的情况 */
    doubleThree : boolean,
    /** 是否禁止多于5子连成一线（6子一线，7子一线等等）的情况 */
    moreThanFive : boolean
}

/**
 * 禁手位置对象
 */
interface BanPosition {
    /** 棋子的 x 坐标 */
    x:number, 
    /** 棋子的 y 坐标 */
    y:number, 
    /** 在此位置可以形成 5 子的情况统计（每路已经存在的棋子数量必须相等，且数量只能是2或3），大与 1 则表示有多种方式可以 5 子连成一线，才能是禁手 */
    count:number,
    /** 判断的禁手类型：1表示长连，2表示双四,3表示双三 */
    type: 1 | 2 | 3,
    /** 这个棋子连成一线的走向 */
    lineDirect:number[]
}

/**
 * 禁手统计判断对象
 */
interface BanPositionMap {
    [key: string]: BanPosition
}

/**
 * 可以落子的位置的打分对象
 */
interface PositionScore {
    [key: string]:{
        /** 棋子的 x 坐标 */
        x:number, 
        /** 棋子的 y 坐标 */
        y:number, 
        /** 棋子的总得分 */
        score:number
    }
}

export { Chess, ChessHistory, UserChessListenner, GameState, GameOverListenner, GameResult, GoBangResult, ForbidRules, BanPosition, BanPositionMap, PositionScore };